package caj.springboot.model.mapstruct;

import org.mapstruct.Named;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;


/**
 * @description: 通用的中央转化器
 * @author: CAJ
 * @time: 2025/08/29 14:20
 */
@Component // 可以被 Spring 管理，方便注入（如果需要）
@Named("CentralMappingConverter") // 给它自己一个名字
public class CentralMappingConverter {

    private static final DateTimeFormatter DT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
    private static final ZoneId ZONE_ID = ZoneId.systemDefault();


    /**
     * Date 转格式化的日期时间字符串 (yyyy-MM-dd HH:mm:ss)
     */
    @Named("formatDateTime")
    public String formatDateTime(Date date) {
        if (date == null) {
            return null;
        }
        LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);
        return localDateTime.format(DT_FORMATTER);
    }

    /**
     * LocalDateTime 转格式化的日期时间字符串 (yyyy-MM-dd HH:mm:ss)
     */
    @Named("formatDateTime")
    public String formatDateTime(LocalDateTime localDateTime) {
        if (localDateTime == null) {
            return null;
        }
        return localDateTime.format(DT_FORMATTER);
    }

    /**
     * LocalDate 转格式化的日期字符串 (yyyy-MM-dd)
     */
    @Named("formatDate")
    public String formatDate(LocalDate localDate) {
        if (localDate == null) {
            return null;
        }
        return localDate.format(DATE_FORMATTER);
    }

    /**
     * Date 转格式化的日期字符串 (yyyy-MM-dd)
     */
    @Named("formatDate")
    public String formatDate(Date date) {
        if (date == null) {
            return null;
        }
        LocalDate localDate = date.toInstant().atZone(ZONE_ID).toLocalDate();
        return localDate.format(DATE_FORMATTER);
    }

    /**
     * LocalTime 转格式化的时间字符串 (HH:mm:ss)
     */
    @Named("formatTime")
    public String formatTime(LocalTime localTime) {
        if (localTime == null) {
            return null;
        }
        return localTime.format(TIME_FORMATTER);
    }
    // endregion

    // region 数字格式化相关
    /**
     * BigDecimal 转字符串（保留两位小数，四舍五入）
     */
    @Named("bigDecimalToString")
    public String bigDecimalToString(BigDecimal value) {
        if (value == null) {
            return null;
        }
        return value.setScale(2, RoundingMode.HALF_UP).toString();
    }

    /**
     * BigDecimal 转货币格式字符串（如：¥1,234.56）
     */
    @Named("bigDecimalToCurrency")
    public String bigDecimalToCurrency(BigDecimal value) {
        if (value == null) {
            return null;
        }
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
        return currencyFormat.format(value);
    }

    /**
     * Double 转百分比字符串（如：25.5%）
     */
    @Named("doubleToPercent")
    public String doubleToPercent(Double value) {
        if (value == null) {
            return null;
        }
        NumberFormat percentFormat = NumberFormat.getPercentInstance();
        percentFormat.setMinimumFractionDigits(1);
        return percentFormat.format(value);
    }

    /**
     * Long 转带千位分隔符的字符串（如：1,000,000）
     */
    @Named("longToFormattedString")
    public String longToFormattedString(Long value) {
        if (value == null) {
            return null;
        }
        NumberFormat numberFormat = NumberFormat.getInstance();
        return numberFormat.format(value);
    }
    // endregion

    // region 枚举转换相关
    /**
     * 枚举转其名称字符串（通用方法）
     */
    @Named("enumToName")
    public String enumToName(Enum<?> enumValue) {
        if (enumValue == null) {
            return null;
        }
        return enumValue.name();
    }


    // endregion

    // region 布尔值转换相关
    /**
     * Boolean 转中文描述
     */
    @Named("booleanToChinese")
    public String booleanToChinese(Boolean value) {
        if (value == null) {
            return "未知";
        }
        return value ? "是" : "否";
    }

    /**
     * Boolean 转数字（1/0）
     */
    @Named("booleanToNumber")
    public Integer booleanToNumber(Boolean value) {
        if (value == null) {
            return null;
        }
        return value ? 1 : 0;
    }

    /**
     * 数字转Boolean（1=true，其他=false）
     */
    @Named("numberToBoolean")
    public Boolean numberToBoolean(Integer value) {
        if (value == null) {
            return null;
        }
        return value == 1;
    }
    // endregion

    // region 空值和安全转换相关
    /**
     * 安全转换为字符串（避免NPE）
     */
    @Named("safeToString")
    public String safeToString(Object obj) {
        if (obj == null) {
            return null;
        }
        return obj.toString();
    }

    /**
     * 空字符串转为null
     */
    @Named("emptyStringToNull")
    public String emptyStringToNull(String value) {
        if (value == null || value.trim().isEmpty()) {
            return null;
        }
        return value;
    }

}